package peace.gui.dnd
{
import flash.display.DisplayObjectContainer;
import flash.geom.Point;
import flash.geom.Rectangle;
	
/**
 * Таскаемый объект для HotArea
 */	
public class DragItem extends Draggable
{
	/**
	 * текущая горячая область, на которой находится айтем 
	 */
	public var currentArea:HotArea = null;
	/**
	 * список HotAreas, с которыми можем трахаться
	 */	
	public var areas:Array = new Array();
	/**
	 * 
	 * @param dragBoundsRect Rectangle
	 * 
	 */
	public function DragItem (dragBoundsRect:Rectangle = null)
	{
		super(dragBoundsRect);
	}
	/**
	 * 
	 * @param a
	 * 
	 */
	public function addHotArea (a:HotArea):void
	{
		if(areas.indexOf(a) == -1)	areas.push(a);
	}
	/**
	 * 
	 * @param a
	 * 
	 */	
	public function removeHotArea (a:HotArea):void
	{
		var index:int = areas.indexOf(a);
		if (index >= 0)	areas.splice(index, 1);
	}
	/**
	 * 
	 * @param p Point
	 * 
	 */
	override public function restorePosition (p:Point = null):void
	{
		// если есть текущая гор. область, то возвращаемся на неё
		if (currentArea) currentArea.placeItem(this);
		else super.restorePosition(p);	
	}
	/**
	 * 
	 * 
	 */	
	override public function endDrag ():void
	{
		super.endDrag();
		
		var a:HotArea = checkIntersections();
		if (a && currentArea != a)
		{
			if (currentArea) currentArea.remove(this);
			
			a.add(this);
		}
		else
		{
			restorePosition();
		}
	}
	/**
	 * 
	 * Проверяем пересечения с горячими областями
	 * 
	 */	
	public function checkIntersections ():HotArea
	{
		if (areas.length > 0)
		{			
			var a:HotArea;
			var arr:Array = [];
			// собираем массив Областей, над которыми курсор, возвр. высшую
			for each (a in areas)	
			{
				if (a.hitTestPoint(stage.mouseX, stage.mouseY, true))
				{
					arr.push(a);
				}
			}
			if (arr.length > 0)	return getHighestDepthHotArea(arr);
			
			// собираем массив Областей, которые пересекаются по форме, возвр. высшую
			for each (a in areas)	
			{
				if (hitTestObject(a))
				{
					arr.push(a);
				}
			}
			if (arr.length > 0)	return getHighestDepthHotArea(arr);
		}
		return null;
	}
	/**
	 * 
	 * @param array
	 * @return 
	 * 
	 */	
	private function getHighestDepthHotArea (array:Array):HotArea
	{
		// если области не имеют общего родителя, тупо возвращаем первую  
		// иначе вытаскиваем самую высокую
		var a:HotArea;
		var prnt:DisplayObjectContainer;
		var depth:int = 0;
		var i:int;
		for each (a in array)
		{
			if (prnt && prnt != a.parent) return HotArea(array[0]);
			else prnt = a.parent;
			
			i = prnt.getChildIndex(a);
			if (i > depth) depth = i;
		}
		
		return HotArea(prnt.getChildAt(depth));
	}
	
}
	
}